# -*-coding utf-8 -*-

__project__ = 'le-bo16'
__file_name__ = 'class8'
__author__ = 'hqDu'
__time__ = '2020-11-13 23:49'
__product_name = 'PyCharm'
# @fileName :class8.py


# 变量  已完成
# 函数，由很多变量组成；提高效率，减少代码冗余
# 类，由很多函数组成
# 模块，由很多类组成
# 包，由很多的模块组成
# 项目，由很多包组成

# 函数定义
# 函数名命名规则：大驼峰、小驼峰、下划线都可
# def my_function():
#     """
#
#     :return:
#     """
#     print("ads")
#
# # 函数调用，函数定义与调用之间要空两行
# my_function()
#
# #查看函数文档说明，就是函数注释
# help(my_function())


# 函数内部不知道要填写什么内容，需要用pass代替，否则运行出错
# def my_func(a,b):
#     """
#     # TODO: 这次不写下次写
#     :param a:
#     :param b:
#     :return:
#     """
#     pass


# 参数
# 函数定义时添加参数，形参，没有实际意义
# def my_fun(a, b):
# 	res = a + b
# 	print(res)
#
# my_fun(1, 2)  # 实参
# my_fun(b=1, a=2)  # 关键字参数（形参=实参），可以参数互换位置 ,不想按照规定的顺序写参数时，可以在前面加上所有形参的名字




# # 函数有返回值，只要有return，就必须在函数调用时打印
# def my_fun():
#     return 'lebo'
#
# print(my_fun())

# 函数名相同时，会发生覆盖，所以不要有相同的函数名
# def my_func():
#     print('0')
#
# def my_func():
#     print('1')
#
# my_func()  # 打印1
#
# def my_func(a):
#     print(a)
#
# my_func()  # 会报错，因为函数my_func()和my_func(a)，函数名相同，所以发生覆盖，直接my_func()调用会出错，提示传参



# 函数嵌套
# def my_func():
#     print('0')
#
# def my_func1():
#     print('1')
#     my_func()
#
# my_func1()  # 按住ctrl+左键点击调用函数，可以跳转到函数在哪




# 参数
# 缺省参数 age=18，只有缺省参数和普通形参，没有不定长参数的情况下，缺省参数要放在最后
# def pr0(name, age=18):
#     print(name,age)
#
# pr0('hha',20)

# 不定长参数之元组 *args  *表示参数长度不确定，而且print(args)返回元组
# 不定长参数之字典 **kwargs  **传递关键字参数 参数长度不确定，而且print(kwargs)返回字典
# def pr(a, *args, b='1', **kwargs):
#     print(a)
#     print(args)
#     print(args[0])
#     # print(args[1000])  # 越界 报错
#     print(len(args))
#     print(b)
#     print(kwargs)
#     print(kwargs.items())
#
# pr(1,'2','sd','dsa',b='0',d=2,c=1,f=4)

# def pr(a, b='1', *args, **kwargs):
#     print(a)
#     print(args)
#     print(args[0])
#     # print(args[1000])  # 越界 报错
#     print(len(args))
#     print(b)
#     print(kwargs)
#     print(kwargs.items())
#
# pr(1,'0','2','sd','dsa',d=2,c=1,f=4)  # 如果写b='0'，报错

# def pr(a,*args,b='1',c, **kwargs):
#     print(a)
#     print(args)
#     print(args[0])
#     # print(args[1000])  # 越界 报错
#     print(len(args))
#     print(b)
#     print(kwargs)
#     print(kwargs.items())
#
# pr(1,'0','2','sd',c='dsa',d=2,w=1,f=4)

# 一般的，参数顺序：
# 不定长参数之元组与缺省参数的位置是平级的；
# 普通形参 不定长参数之元组 缺省参数 不定长参数之字典   注意：实参中缺省参数必须要使用关键字参数
# 普通形参 缺省参数 不定长参数之元组 不定长参数之字典   注意，实参中缺省参数一定不可以使用关键字参数
# 普通形参可以放置到不定长参数之后，但是实参中必须对该普通参数使用关键字参数
# **不定长参数之字典，返回字典，一般放在形参最后，而且实参的关键字参数不可以与任何形参名一致，否则报错
# 普通参数如果放置到不定长参数之字典之后，实参中如果对该普通参数传送关键字参数，会被不定长参数之字典拿了



# args和kwargs可以为空
# 所有的参数必须一一对应




# 全局变量和局部变量
# 如果一个变量，既能在一个函数中使用，也能在其他的函数中使用，这样的变量就是全局变量
# 局部变量，只能在一个函数内使用的变量
# 如果在函数中出现global 全局变量的名字 那么这个函数中即使出现和全局变量名相同的变量名 = 数据
# 也理解为对全局变量进行修改，而不是定义局部变量
a = 100  # 全局变量
def add_num():
	a = 10  # 局部变量a
	b = 10
	return a + b

add_num()  # 结果20




a = 100  # 全局变量
def add_num1():
	# a = 10  # 局部变量a
	b = 20
	return a + b

add_num1()  # 结果120

# 把局部变量更改为全局变量
def add_num2():
	global a
	a = 200

add_num1()  # 120，并没有调用函数add_num2()




a = 100  # 全局变量
def add_num1():
	# a = 10  # 局部变量a
	b = 20
	return a + b

add_num1()  # 结果120

# 把局部变量更改为全局变量
def add_num2():
	global a, b
	a = 200
	b = 300

add_num2()  #调用此函数，才会改变a为全局变量;否则运行的还是全局变量
add_num1()  # 220




a = 100  # 全局变量
def add_num1():
	# a = 10  # 局部变量a
	b = 10
	return a + b

add_num1()  # 结果120

# 把局部变量更改为全局变量
def add_num2():
	global a
	a = 200

add_num1()  # 120
add_num2()  # 调用次函数，才会改变a为全局变量
add_num1()  # 220
# 看到return，相当于break

# multi = lambda a,b:a*b
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [i for i in a if i%2==1]
print(b)